package main

import (
	"fmt"
	"time"
)

func main() {
	slice := []int{0, 1, 2, 3}
	m := make(map[int]*int) // 指针类型
	for key, val := range slice {
		// for-range 其实是语法糖，内部调用还是 for 循环，初始化会拷贝带遍历的列表（如 array，slice，map），
		//然后每次遍历的val都是对同一个元素的遍历赋值。也就是说如果直接对v取地址，最终只会拿到一个地址，
		//而对应的值就是最后遍历的那个元素所附给v的值
		m[key] = &val
	}
	for k, v := range m {
		fmt.Println(k, "==>", *v)
	}
	// out
	//0 ==> 3
	//1 ==> 3
	//2 ==> 3
	//3 ==> 3
	fmt.Println()
	// 改进1
	for key, val := range slice {
		v := val
		m[key] = &v
	}

	for k, v := range m {
		fmt.Println(k, "==>", *v)
	}
	// out
	//0 ==> 0
	//1 ==> 1
	//2 ==> 2
	//3 ==> 3
	fmt.Println()
	// 改进2
	for k := range slice {
		m[k] = &slice[k]
	}

	for k, v := range m {
		fmt.Println(k, "==>", *v)
	}
	// out
	//0 ==> 0
	//1 ==> 1
	//2 ==> 2
	//3 ==> 3

	for i := 0; i < 3; i++ {
		go func() {
			fmt.Println(i) // 每个协程里的i是同一个，for循环比较快，所以i加的比较快
		}()
	}
	// out
	// 3
	// 3
	// 3

	for i := 0; i < 3; i++ {
		go func(n int) {
			fmt.Println(n) // n 是值传递，地址和i不一样
		}(i)
	}
	// out
	// 1
	// 2
	// 3
	time.Sleep(1 * time.Second)
}
